// 引入express模块，用于创建路由
import express from 'express';
// 创建一个路由器实例
const router = express.Router();
// 引入Book模型，用于操作图书数据
import Book from './models/Book.js';

// 定义一个GET路由，用于获取所有图书
router.get('/', async (req, res) => {
  try {
    // 从数据库中查找所有图书
    const books = await Book.find();
    // 如果成功，返回所有图书数据，并设置状态码为200
    res.status(200).json(books);
  } catch (error) {
    // 如果发生错误，返回错误信息，并设置状态码为500
    res.status(500).json({ message: error.message });
  }
});

// 定义一个POST路由，用于添加新图书
router.post('/', async (req, res) => {
  // 创建一个新的Book实例，使用请求体中的数据
  const book = new Book({
    title: req.body.title,
    author: req.body.author,
    publisher: req.body.publisher,
    publishDate: req.body.publishDate
  });

  try {
    // 将新图书保存到数据库中
    const newBook = await book.save();
    // 如果成功，返回新图书数据，并设置状态码为201
    res.status(201).json(newBook);
  } catch (error) {
    // 如果发生错误，返回错误信息，并设置状态码为400
    res.status(400).json({ message: error.message });
  }
});

// 定义一个GET路由，用于获取特定ID的图书
router.get('/:id', getBook, (req, res) => {
  // 使用中间件getBook找到的图书，返回给客户端，并设置状态码为200
  res.status(200).json(res.book);
});

// 定义一个PATCH路由，用于更新特定ID的图书
router.patch('/:id', getBook, async (req, res) => {
  // 更新图书信息，如果请求体中提供了相应的字段
  if (req.body.title != null) {
    res.book.title = req.body.title;
  }
  if (req.body.author != null) {
    res.book.author = req.body.author;
  }
  if (req.body.publisher != null) {
    res.book.publisher = req.body.publisher;
  }
  if (req.body.publishDate != null) {
    res.book.publishDate = req.body.publishDate;
  }

  try {
    // 保存更新后的图书信息到数据库
    const updatedBook = await res.book.save();
    // 如果成功，返回更新后的图书数据，并设置状态码为200
    res.status(200).json(updatedBook);
  } catch (error) {
    // 如果发生错误，返回错误信息，并设置状态码为400
    res.status(400).json({ message: error.message });
  }
});

// 定义一个DELETE路由，用于删除特定ID的图书
router.delete('/:id', getBook, async (req, res) => {
  try {
    // 从数据库中删除找到的图书
    await res.book.remove();
    // 如果成功，返回删除信息，并设置状态码为200
    res.status(200).json({ message: 'Deleted Book' });
  } catch (error) {
    // 如果发生错误，返回错误信息，并设置状态码为500
    res.status(500).json({ message: error.message });
  }
});

// 定义一个中间件函数，用于根据ID获取图书
async function getBook(req, res, next) {
  let book;
  try {
    // 从数据库中根据ID查找图书
    book = await Book.findById(req.params.id);
    if (book == null) {
      // 如果没有找到图书，返回404状态码和错误信息
      return res.status(404).json({ message: 'Cannot find book' });
    }
  } catch (error) {
    // 如果发生错误，返回500状态码和错误信息
    return res.status(500).json({ message: error.message });
  }

  // 将找到的图书附加到响应对象上，以便后续中间件或路由使用
  res.book = book;
  // 调用next()继续到下一个中间件或路由处理程序
  next();
}

// 导出路由器，以便在app.js中挂载
module.exports = router;
